import datetime
import time

import azure.cognitiveservices.speech as speechsdk
import os

class Mtts():
    def __init__(self,db,MyPath=None):
        self.api_key = db.azure_ttsapi_key
        self.region = db.azure_region
        self.voice_name = db.azure_voice_name

        self.MyPath =  MyPath

    def text_to_speech_to_file(self, text, filename):

        # 创建语音配置
        speech_config = speechsdk.SpeechConfig(subscription=self.api_key, region=self.region)
        speech_config.speech_synthesis_voice_name = self.voice_name
        # 创建音频输出配置
        audio_config = speechsdk.audio.AudioOutputConfig(filename=filename)
        # print(f" filename={filename}    subscription={self.api_key}, region={self.region} voice_name ={self.voice_name} ")
        synthesizer = speechsdk.SpeechSynthesizer(speech_config=speech_config, audio_config=audio_config)
        result = None
        # 合成文本并保存为文件
        result = synthesizer.speak_text_async(text).get()

        # 判断是否成功
        try:
            if result and result.reason == speechsdk.ResultReason.SynthesizingAudioCompleted:
                print(f"语音合成成功，音频文件保存为 {filename}")

            elif result:
                print(f"语音合成失败，错误原因: {result.reason}")
                if result.reason == speechsdk.ResultReason.Canceled:
                    cancellation_details = result.cancellation_details
                    print(f"取消的详细信息: {cancellation_details.reason}")
                    if cancellation_details.reason == speechsdk.CancellationReason.Error:
                        print(f"错误详情: {cancellation_details.error_details}")
            else:
                print("语音合成失败: 结果为空")
        except Exception as e:
            print(f"语音合成过程发生异常: {str(e)}")
            return False

        return  True




    # 添加新的文本到语音转换任务
    def run(self, text, filename=None):
        if filename==None:
            #时间戳加后缀
            filename = self.get_current_time() + ".mp3"
            print(f"没有指定文件名，将使用时间戳作为文件名{filename}")
        print("filename=", filename)
        mpath=self.MyPath +filename
        print("mpath=", mpath)
        self.text_to_speech_to_file(text, mpath)
        return {
            "filename": filename,
            "path":mpath,
            "video_scripts": text,
            "azure_voice_name": self.voice_name

        }

    # 删除已有的音频文件和对应的记录
    def delete_text(self, filename):
        if filename in self.prompts:
            try:
                os.remove(filename)
                del self.prompts[filename]
                print(f"成功删除文件 {filename}")
                return True
            except FileNotFoundError:
                print(f"文件 {filename} 未找到，但记录已删除")
                del self.prompts[filename]
                return True
            except Exception as e:
                print(f"删除文件 {filename} 时发生错误: {str(e)}")
                return False
        else:
            print(f"未找到文件名 {filename} 的记录")
            return False

    # 修改已有的文本并重新生成音频文件
    def update_text(self, filename, new_text):
        if filename in self.prompts:
            try:
                os.remove(filename)
                return self.text_to_speech_to_file(new_text, filename)
            except FileNotFoundError:
                print(f"文件 {filename} 未找到，直接重新生成")
                return self.text_to_speech_to_file(new_text, filename)
            except Exception as e:
                print(f"更新文件 {filename} 时发生错误: {str(e)}")
                return self.prompts
        else:
            print(f"未找到文件名 {filename} 的记录，无法更新")
            return self.prompts

    # 查询已有的文本和文件名映射
    def query_text(self, filename=None):
        if filename:
            return self.prompts.get(filename)
        else:
            return self.prompts

    def get_current_time(self):

        now = datetime.datetime.now()
        return    now.strftime("%Y-%m-%d-%H%M%S")


if __name__ == '__main__':
    text = """
    日日看黄历，事事皆顺利。2月21日农历正月二十四，星期五。今天值日是“危”。在黄历里，危日适合做一些带有冒险、开拓性质的事，像尝试新的工作方法、开拓新业务，相对会比较顺利。但不建议进行安床、搬家这类需要安稳的事儿。
    今日值神是玄武，玄武为黑道日，行事要格外小心谨慎。在生活里，做重大决策前务必深思熟虑，以免出现意外状况。
    今日生肖冲煞为鸡日冲兔，属兔的朋友要多留意，做事更需沉稳。
    幸运色方面，今日可选择黑色、蓝色系衣服，能带来好运。打麻将的话，推荐坐在北方方位，从玄学角度讲，可能更易获胜。不过要记得，黄历玄学仅供参考，保持积极的心态和理性的行动，才是生活顺遂的关键。愿大家今日都诸事顺遂，开开心心。 
    日日看黄历 事事皆顺利。2月21日，农历正月二十四，星期五。今天值日是“危”。在黄历里，危日适合做一些带有冒险、开拓性质的事，像尝试新的工作方法、开拓新业务，相对会比较顺利。但不建议进行安床、搬家这类需要安稳的事儿。
    今日值神是玄武，玄武为黑道日，行事要格外小心谨慎。在生活里，做重大决策前务必深思熟虑，以免出现意外状况。
    今日生肖冲煞为鸡日冲兔，属兔的朋友要多留意，做事更需沉稳。
    幸运色方面，今日可选择黑色、蓝色系衣服，能带来好运。打麻将的话，推荐坐在北方方位，从玄学角度讲，可能更易获胜。不过要记得，黄历玄学仅供参考，保持积极的心态和理性的行动，才是生活顺遂的关键。愿大家今日都诸事顺遂，开开心心。 
    """




    class DB_Setting:
        def __init__(self ):
            self.tts_api_key = "78to0jpxK3pAxCHIE2j0STKfNe2RBLzEDu9LvkYILmQwR15Qs0oCJQQJ99BBACYeBjFXJ3w3AAAYACOGcDCg"
            self.region = "eastus"
            self.voice_name = "zh-CN-XiaoxiaoMultilingualNeural"
    db=DB_Setting()
    tts = Mtts(db.region, db.tts_api_key, db.voice_name)

    # 添加新的文本到语音转换任务
    tts.run(text, "dx.mp3")

    # 查询所有记录
    print("所有记录:", tts.query_text())
    #
    # # 查询特定记录
    # print("特定记录:", tts.query_text("auto.mp3"))
    #
    # # 修改记录
    # new_text = "这是修改后的文本"
    # tts.update_text("auto.mp3", new_text)

    # 删除记录
    # tts.delete_text("auto.mp3")